/*
*  Dart中可以使用var声明变量，那么泛型的意义何在？
*    1. 简化相同的逻辑
*    2. 限制可使用范围
* */
void main() {
  //调用泛型方法
  print(testFun2(1));
  print(testFun2('dart'));

  //使用泛型类
  var sClazz = ArrayClass<String>();
  sClazz.add("fauks");
  sClazz.add("slx");
  sClazz.printList();

  //泛型接口,将泛型声明为String类型
  var mClazz = MemoryCache<String>();
  mClazz.setCache("goods", "goodsBean");
}

//定义一个方法可以传入不同类型(String、Int等)
//方式一 可以不指定类型，缺点是没了类型监测
void testFun(value) {
  return value;
}

//使用泛型解决 <T> 为方法声明一个泛型
T testFun2<T>(T value) {
  return value;
}

//定义泛型类，可以接收任意二类型
class ArrayClass<T> {
  List list = <T>[];

  void add(T value) {
    list.add(value);
  }

  void printList() {
    for (var value in list) {
      print(value);
    }
  }
}

//定义泛型接口 -->缓存
abstract class Cache<T> {
  void setCache(String key, T value);
}

//泛型类的实现类
class MemoryCache<T> implements Cache<T> {
  @override
  void setCache(String key, T value) {
    print('内存缓存key=$key,value=$value');
  }
}
